/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tutorial.LooseCoupling;

import tutorial.LooseCoupling.robot.Robot;
import tutorial.LooseCoupling.robot.bodys.Picioare;
import tutorial.LooseCoupling.robot.bodys.Rotzi;
import tutorial.LooseCoupling.robot.bodys.Senile;
import tutorial.LooseCoupling.robot.weapons.Bazooka;
import tutorial.LooseCoupling.robot.weapons.Pistol;
import tutorial.LooseCoupling.robot.weapons.Sabie;

/**
 * Cred ca era mai important sa incep cu asta dar, na...
 * 
 * Conceptul de "Loose coupling" (sau decuplarea codului)
 * practic se refera la decuplarea implementarii.
 * 
 * O Clasa nu trebuie sa stie despre implementarea claselor de care depinde
 * Acest lucru se poate face prin, asa numita, progamare pe interfete.
 * Asta o sa incerc sa arat in tutorialul acesta
 * @author Boogie
 */
public class LooseCouplingMain {
    public static void main(String [] args){
        Robot robot = new Robot();
        //de abia aici robotul afla ce implmentare are pentru Body si Weapon
        robot.setWeapon(new Pistol());
        robot.setBody(new Rotzi());
        
        
        robot.attack();
        robot.move();
        /*
         * bine inteles ca pot oricand sa schimb implemetarea la cele doua interfete
         * partea aceasta cu setter pentru implementari este o chestie specifica 
         * pentru Strategy Pattern (un oop design pattern)
         * dar ideea vine de la conceptul de programare pe interfete
         * 
         */
        robot.setWeapon(new Bazooka());
        robot.setBody(new Picioare());
        
        robot.attack();
        robot.move();
        
        /*
         * Modul standard de abordare este injectarea implementarii prin constructor
         * De aceea am creat al doilea contructor pentru Robot
         */
        Robot robot2 = new Robot(new Senile(),new Sabie());
        System.out.println("Robot2:");
        robot2.move();
        robot2.attack();
        
        /* 
         * Decuplarea are foate multe avantaje, dar poate cel mai important este 
         * faptul ca, odata create interfele, mai multi programatori pot lucra la
         * mai multe module fara a stii nimic despre implementarea celorlante module.
         * Se stie doar ce date intra si ce date ies din sistem
         * 
         */
        
        
        /*
         * Sper ca ii cat de cat usor de inteles.
         * Conceptul nu e greu dar trebuie sa te obisnuiesti cu el
         * As always putezi sa ma intrebati orice pe group sau la faculta daca
         * aveti nelamuriri si bine inteles daca citeste cineva chestiile astea
         */
        
    }
}
